
# 导入相关模块
import torch
from torch.utils.data import TensorDataset
# 导入构造数据集对象
from torch.utils.data import DataLoader
# 导入数据加载器
from torch import nn
# nn模块中有平方损失函数和假设函数
from torch import optim
# optim模块中有优化器
from sklearn.datasets import make_regression
# 创建线性回归模型数据集
import matplotlib.pyplot as plt

# 绘图模块
#  pip install scikit-learn matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple


# 使用PyTorch的nn.SELoss0代替自定义的平方损失函数
# 使用PyTorch的data.DataLoader代替自定义的数据加载器
# 使用PyTorch的optim.SGD代替自定义的优化器
# 使用PyTorch的nn.Linear代替自定义的假设函数


plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


def create_dataset():
    x, y, conf = make_regression(n_samples=100,
                                 n_features=1,
                                 random_state=0,
                                 noise=10,
                                 bias=10,
                                 coef=True)

    # 将构建数据转换为张量类型
    x = torch.tensor(x, dtype=torch.float32)
    y = torch.tensor(y, dtype=torch.float32)
    conf = torch.tensor(conf, dtype=torch.float32)
    return x, y, conf


if __name__ == '__main__':
    # 生成的数据
    x, y, conf = create_dataset()
    # 绘制数据的真实线性回归结果
    plt.scatter(x, y)
    x_new = torch.linspace(x.min(), x.max(), 1000)
    y1 = x_new * conf + 1.5
    # 使用新生成的 x_new 和 y1 绘图
    plt.plot(x_new, y1, label='real')
    plt.grid()
    plt.legend()
    # 切换 Matplotlib 后端， 使用TkAgg交互式窗口避免代码运行完后窗口直接被关闭
    plt.switch_backend('TkAgg')
    plt.show()
    
